package com.zhisheng.demo03_Stream_Hello;

import java.util.List;
import java.util.stream.Stream;

/**
 * 创建者： 智晟全哥
 *
 * 练习Stream流的中间(延迟)方法,调用这些方法之后,返回的是一个新的流对象,可以继续使用新的流对象调用方法(链式编程)
 *
 */
public class MyStream1 {
    public static void main(String[] args) {
        // 1: 获取流对象
        Stream<String> stream = Stream.of("a", "dd",  "b", "abc","ccc","dd");
        // 2: 面向流对象,调用方法
        // 筛选出长度不小于2的元素,去重,按长度降序排列,跳过第一个,保留前两个
        List<String> list = stream.filter(y -> y.length() >= 2).distinct().sorted((a, b) -> b.length() - a.length()).skip(1).limit(1).toList();
        System.out.println(list);

        // 3: 流对象调用任意一个方法后都是返回一个新的流对象,旧的流对象就不能继续使用了,
        Stream<String> stream1 = stream.filter(y -> y.length() >= 2).distinct();
        // stream1这个变量,记录的流状态,一旦调用了方法后,流已经向后走了一步,不能继续使用stream1这个变量记录的流状态再调用其他方法了,否则会出现IllegalStateException异常
        List<String> list1 = stream1.sorted((a, b) -> b.length() - a.length()).toList();
        //List<String> list2 = stream1.sorted().toList();
        System.out.println(list1);
        //System.out.println(list2);

    }
}
